#pragma once

#include "adalog/LogLevel.h"
#include <chrono>
#include <thread>
#include <memory>

namespace adalog
{
    class LogEvent
    {
    public:
        using TimePoint = std::chrono::system_clock::time_point;
        using Ptr = std::shared_ptr<LogEvent>;
        virtual ~LogEvent() = default;

        explicit LogEvent(const std::string& payload, 
                          const std::string& logger_name, 
                          LogLevel::Value log_level, 
                          std::chrono::system_clock::time_point log_time,
                          const std::string& file_name,
                          size_t line,
                          std::thread::id thread_id);

        std::string GetPayload() const;
        std::string GetLoggerName() const;
        LogLevel::Value GetLogLevel() const;
        TimePoint GetLogTime() const;
        std::string GetFileName() const;
        size_t GetLine() const;
        std::thread::id GetThreadId() const;

    private:
        std::string payload_;
        std::string logger_name_;
        LogLevel::Value log_level_;
        TimePoint log_time_;
        std::string file_name_;
        size_t line_;
        std::thread::id thread_id_;
    };

} // namespace adalog